package com.atguigu.lease.web.admin.custom.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

/**
 * 转换器工厂，用于将字符串转换为BaseEnum枚举类型。
 * 这个工厂类会被Spring容器自动注册，因为它使用了@Component注解。
 */
@Component
public class StringToBaseEnumConverterFactor implements ConverterFactory<String, BaseEnum> {

    /**
     * 根据目标枚举类型，创建并返回一个字符串到枚举的转换器。
     *
     * @param targetType 目标枚举类型
     * @param <T>        BaseEnum的子类型
     * @return 字符串到枚举的转换器
     */
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        // 返回一个匿名内部类，实现Converter接口
        return new Converter<String, T>() {
            /**
             * 将字符串转换为枚举类型。
             *
             * @param code 要转换的字符串代码
             * @return 转换后的枚举类型
             * @throws IllegalArgumentException 如果传入的代码不合法，则抛出此异常
             */
            @Override
            public T convert(String code) {
                // 获取目标枚举类型的所有枚举常量
                T[] enums = targetType.getEnumConstants();
                // 遍历所有的枚举常量
                for (T e : enums) {
                    // 检查当前枚举常量的代码是否与传入的代码匹配
                    if (e.getCode().equals(Integer.valueOf(code))) {
                        // 如果匹配，则返回当前的枚举常量
                        return e;
                    }
                }
                // 如果没有找到匹配的枚举常量，则抛出异常，指出传入的代码不合法
                throw new IllegalArgumentException("code" + code + "非法");
            }
        };
    }
}